home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / CLIPBD_U / CLPBRD / CLIPBRD.PAS < prev    next >
Pascal/Delphi Source File  |  1994-09-15  |  5KB  |  282 lines

  1. unit ClipBrd;
  2.  
  3. { Unit Clipboard, Version 1.00.001, Copyright (c) 1994 by Matthias Köppe.
  4. }
  5.  
  6. {$G+,X+}
  7.  
  8. interface
  9.  
  10. { Clipboard format identifiers
  11. }
  12. const
  13.   cf_Text         = 1;
  14.   cf_Bitmap       = 2;
  15.   cf_MetaFilePict = 3;
  16.   cf_SYLK         = 4;
  17.   cf_DIF          = 5;
  18.   cf_TIFF         = 6;
  19.   cf_OEMText      = 7;
  20.   cf_DIB          = 8;
  21.   cf_Palette      = 9;
  22.  
  23. { Clipboard functions
  24. }
  25. function OpenClipboard: Boolean;
  26. function CloseClipboard: Boolean;
  27. function EmptyClipboard: Boolean;
  28. function SetClipboardData(Format: Word; var Data; Size: LongInt): Boolean;
  29. function GetClipboardDataSize(Format: Word): LongInt;
  30. function GetClipboardData(Format: Word; var Data): Boolean;
  31.  
  32. { Emulation control
  33. }
  34. procedure ForceEmulation;
  35.  
  36. { WinOldAp-present flag
  37. }
  38. var
  39.   WinOldAp: Boolean;
  40.  
  41. implementation
  42.  
  43. type
  44.   PFormatEntry = ^TFormatEntry;
  45.   TFormatEntry = record
  46.     feNext: PFormatEntry;
  47.     feFormat: Word;
  48.     feData: pointer;
  49.     feSize: LongInt
  50.   end;
  51.  
  52. const
  53.   EmClipboard: PFormatEntry = nil;
  54.  
  55. var
  56.   SaveExit: pointer;
  57.  
  58. procedure DetectWinOldAp; near; assembler;
  59. Asm
  60.     MOV    AX, 1700H
  61.     INT    2FH
  62.     CMP    AX, 1700H
  63.     JZ    @@1
  64.     MOV    AL, 1
  65. @@1:    MOV    WinOldAp, AL
  66. End;
  67.  
  68. procedure FindEntry; near; assembler;
  69. { In  DX    format id
  70.   Out ES:SI PFormatEntry
  71. }
  72. Asm
  73.     LES    SI, EmClipboard
  74. @@2:    MOV    AX, ES
  75.     OR    AX, SI
  76.     JZ    @@1
  77.     CMP    DX, ES:[SI].TFormatEntry.feFormat
  78.     JE    @@1
  79.     LES    SI, ES:[SI].TFormatEntry.feNext
  80.     JMP    @@2
  81. @@1:
  82. End;
  83.  
  84. procedure FreeMemProc(p: pointer; Size: Word); near;
  85. Begin
  86.   FreeMem(p, Size)
  87. End;
  88.  
  89. function GetMemProc(Size: Word): pointer; near;
  90. var
  91.   p: pointer;
  92. Begin
  93.   GetMem(p, Size);
  94.   GetMemProc := p
  95. End;
  96.  
  97. function OpenClipboard; assembler;
  98. Asm
  99.     CMP    WinOldAp, 0
  100.     JZ    @em
  101.     MOV    AX, 1701H
  102.     INT    2FH
  103.     OR    AX, AX
  104.     JZ    @end
  105. @em:    MOV    AL, 1
  106. @end:
  107. End;
  108.  
  109. function CloseClipboard; assembler;
  110. Asm
  111.     CMP    WinOldAp, 0
  112.     JZ    @em
  113.     MOV    AX, 1708H
  114.     INT    2FH
  115.     OR    AX, AX
  116.     JZ    @end
  117. @em:    MOV    AL, 1
  118. @end:
  119. End;
  120.  
  121. function EmptyClipboard; assembler;
  122. Asm
  123.     CMP    WinOldAp, 0
  124.     JZ    @em
  125.     MOV    AX, 1702H
  126.     INT    2FH
  127.     OR    AX, AX
  128.     JNZ    @@1
  129.     JMP    @end
  130. @em:    LES    SI, EmClipboard
  131.     MOV    EmClipboard.Word, 0
  132.     MOV    EmClipboard.2.Word, 0
  133. @@2:    MOV    AX, ES
  134.     OR    AX, SI
  135.     JZ    @@1
  136.     PUSH    ES:[SI].TFormatEntry.feNext.2.Word
  137.     PUSH    ES:[SI].TFormatEntry.feNext.Word
  138.     PUSH    ES
  139.     PUSH    SI
  140.     PUSH    ES:[SI].TFormatEntry.feData.2.Word
  141.     PUSH    ES:[SI].TFormatEntry.feData.Word
  142.     PUSH    ES:[SI].TFormatEntry.feSize.Word
  143.     CALL    FreeMemProc
  144.     PUSH    TYPE TFormatEntry
  145.     CALL    FreeMemProc
  146.     POP    SI
  147.     POP    ES
  148.     JMP    @@2
  149. @@1:    MOV    AL, 1
  150. @end:
  151. End;
  152.  
  153. function SetClipboardData; assembler;
  154. Asm
  155.     MOV    DX, Format
  156.     CMP    WinOldAp, 0
  157.     JZ    @em
  158.     MOV    AX, 1703H
  159.     LES    BX, Data
  160.     MOV    CX, Size.Word
  161.     MOV    SI, Size.2.Word
  162.     INT    2FH
  163.     OR    AX, AX
  164.     JZ    @end
  165.     PUSH    Data.2.Word
  166.     PUSH    Data.Word
  167.     PUSH    Size.Word
  168.     CALL    FreeMemProc
  169.     JMP    @@3
  170. @em:    CALL    FindEntry
  171.     MOV    AX, ES
  172.     OR    AX, SI
  173.     JZ    @@1
  174.     PUSH    ES
  175.     PUSH    SI
  176.     PUSH    ES:[SI].TFormatEntry.feData.2.Word
  177.     PUSH    ES:[SI].TFormatEntry.feData.Word
  178.     PUSH    ES:[SI].TFormatEntry.feSize.Word
  179.     CALL    FreeMemProc
  180.     POP    DI
  181.     POP    ES
  182.     ADD    DI, TFormatEntry.feData
  183.     CLD
  184.     JMP    @@2
  185. @@1:    PUSH    WORD PTR Size
  186.     CALL    GetMemProc
  187.     MOV    ES, DX
  188.     MOV    DI, AX
  189.     CLD
  190.     XCHG    AX, EmClipboard.Word
  191.     STOSW
  192.     MOV    AX, DX
  193.     XCHG    AX, EmClipboard.2.Word
  194.     STOSW
  195.     MOV    AX, Format
  196.     STOSW
  197. @@2:    MOV    AX, Data.Word
  198.     STOSW
  199.     MOV    AX, Data.2.Word
  200.     STOSW
  201.     MOV    AX, Size.Word
  202.     STOSW
  203.     MOV    AX, Size.2.Word
  204.     STOSW
  205. @@3:    MOV    AL, 1
  206. @end:
  207. End;
  208.  
  209. function GetClipboardDataSize; assembler;
  210. Asm
  211.     MOV    DX, Format
  212.     CMP    WinOldAp, 0
  213.     JZ    @em
  214.     MOV    AX, 1704H
  215.     INT    2FH
  216.     JMP    @end
  217. @em:    CALL    FindEntry
  218.     MOV    AX, ES
  219.     MOV    DX, SI
  220.     OR    AX, DX
  221.     JZ    @end
  222.     MOV    AX, ES:[SI].TFormatEntry.feSize.Word
  223.     MOV    DX, ES:[SI].TFormatEntry.feSize.2.Word
  224. @end:
  225. End;
  226.  
  227. function GetClipboardData; assembler;
  228. Asm
  229.     MOV    DX, Format
  230.     CMP    WinOldAp, 0
  231.     JZ    @em
  232.     MOV    AX, 1705H
  233.     LES    BX, Data
  234.     INT    2FH
  235.     OR    AX, AX
  236.     JNZ    @@2
  237.     JMP    @end
  238. @em:    CALL    FindEntry
  239.     MOV    AX, ES
  240.     OR    AX, SI
  241.     JZ    @end
  242.     MOV    CX, ES:[SI].TFormatEntry.feSize.Word
  243.     SHR    CX, 1
  244.     PUSH    DS
  245.     PUSHF
  246.     LDS    SI, ES:[SI].TFormatEntry.feData
  247.     LES    DI, Data
  248.     CLD
  249.     REP    MOVSW
  250.     POPF
  251.     JNC    @@1
  252.     MOVSB
  253. @@1:    POP    DS
  254. @@2:    MOV    AL, 1
  255. @end:
  256. End;
  257.  
  258. procedure ClipExit; far;
  259. Begin
  260.   EmptyClipboard;
  261.   ExitProc := SaveExit
  262. End;
  263.  
  264. procedure InstallExit; near;
  265. Begin
  266.   SaveExit := ExitProc;
  267.   ExitProc := @ClipExit
  268. End;
  269.  
  270. procedure ForceEmulation;
  271. Begin
  272.   If WinOldAp then Begin
  273.     InstallExit;
  274.     WinOldAp := false
  275.   End
  276. End;
  277.  
  278. Begin
  279.   DetectWinOldAp;
  280.   If not WinOldAp then InstallExit
  281. End.
  282.